Skip to content

记录一次 Docker 部署目标服务器脚本

背景:

上篇记录了一个项目中的 Docker 服务部署流程,但是实际使用中肯定不够方便,需要记住服务器密码、构建、部署等,流程,还是挺繁杂。

于是写了一个部署脚本,方便团队内部使用以及集成 CI/CD 等。

主要流程:

  1. 配置 SSH 密钥认证
  2. 自动管理 Docker 镜像版本号
  3. 构建 Docker 镜像
  4. Git tag
  5. 打包上传到目标服务器
  6. 目标服务器加载 Docker 镜像
  7. 部署 Docker 镜像

SSH 密钥认证

使用 ssh 密钥认证方式可以自动认证登录目标服务器,避免手动输入登录密码,也可避免密码的滥用。

  1. 生成 ssh 密钥对:
bash
ssh-keygen -t rsa

如果本机已有 rsa 密钥,继续下一步 (下面命令进行查看)

bash
cd ~/.ssh
# 查看目录下文件
ls
  1. 将公钥上传到目标服务器

i:指定公钥文件

bash
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
  1. 上传成功后,就可以不需要使用密码登录目标服务器
bash
ssh user@host

treeder/bump

主要用于在项目构建和发布流程中管理版本号,可以自动递增版本号。

  • 主要的版本号(major)
  • 次要的版本号(minor)
  • 修订版本号(patch)
bash
# 使用 treeder/bump 增加修订版本号
docker run --rm -v "$PWD":/app treeder/bump patch

# 读取新的版本号
version=$(cat VERSION)
echo "New version: $version"

# 接下来,你可以在构建、发布等过程中使用新的版本号
# 例如,更新 Docker 镜像的版本标签、发布新版本等

在上述例子中,treeder/bump patch 表示增加修订版本号。你还可以使用 minormajor 代替 patch,分别表示增加次要版本号和主要版本号

Git Tag

对构建的 Docker 项目进行打标签,可以更好地管理和维护代码库的版本历史,提高代码库的可读性和可维护性,同时为版本发布提供了便捷的方式

如下,对当前的源码版本创建 v1.0.0 标签:

bash
# 创建轻量标签(Lightweight Tag)
git tag v1.0.0

# 创建附注标签(Annotated Tag),可以添加注释
git tag -a v1.0.0 -m "Release version 1.0.0"

# 推送所有标签到远程仓库
git push --tags

完整脚本

脚本中其他使用方法在上篇进行了说明

Click me to view the code
bash
#!/bin/bash

# 调试模式
set -ex

# 远程服务器登录信息
remote_host=$1
remote_port=${2:-2333}

# 检查参数个数
if [ "$#" -le 0 ]; then
    echo Error: 请输入账户以及密码参数
    exit 1
fi

# 远程打包的目录
REMOTE_DIR=images/

# 镜像名称
PREFIX=docker.iflydocs.com
IMAGE=clash-of-llm

# 使用 treeder/bump 自增版本号
docker run --rm -v "$PWD":/app treeder/bump patch
version=`cat VERSION`

# 构建镜像
docker build -t $PREFIX/$IMAGE:latest -t $PREFIX/$IMAGE:$version .

# 推送镜像到 git 仓库
git tag -a "v$version" -m "docker image version $version"
git push --tags

# 推送镜像到 docker 仓库
# TODO

# 打包镜像并上传到服务器
docker save -o ./$IMAGE-$version.tar $PREFIX/$IMAGE:$version
scp ./$IMAGE-$version.tar $remote_host:/root/$REMOTE_DIR

# 删除压缩文件
rm ./$IMAGE-$version.tar

# 使用 ssh 连接到远程服务器
ssh "$remote_host" << EOF

  # 加载镜像压缩文件
  docker load -i $REMOTE_DIR/$IMAGE-$version.tar

  # tag
  docker tag $PREFIX/$IMAGE:$version $PREFIX/$IMAGE:latest
  # 停止并删除 clash-of-llm
  docker stop $IMAGE && docker rm $IMAGE
  # 重启 clash-of-llm
  docker run --name $IMAGE -p $remote_port:3000 -d -v /root/logs:/usr/src/app/logs --restart always $PREFIX/$IMAGE

  # 删除镜像压缩文件
  rm $REMOTE_DIR/$IMAGE-$version.tar

EOF

使用:

bash
# 默认端口号 2333
sh deploy.sh user@host

# 指定端口号
sh deploy.sh user@host port

# e.g.
sh deploy.sh [email protected] 8000

Released under the MIT License.